]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Use clutter_actor_destroy in dispose, add _dispose where needed
authorColin Walters <walters@verbum.org>
Thu, 8 Oct 2009 18:53:46 +0000 (14:53 -0400)
committerColin Walters <walters@verbum.org>
Fri, 9 Oct 2009 20:19:33 +0000 (16:19 -0400)
ClutterGroup calls _destroy, but most of St was just calling _unparent.
This caused problems because the DESTROY signal was not emitted
for child elements after destroying a toplevel.  Also, in a GC'd
binding it would cause unpredictable lifetime of children.

Some St widgets simply didn't have _dispose at all; implement it.

Note because of the usage of the background_image in StButton,
we can't cleanly destroy it inside the StWidget.

https://bugzilla.gnome.org/show_bug.cgi?id=597845

src/st/st-bin.c
src/st/st-box-layout.c
src/st/st-entry.c
src/st/st-label.c
src/st/st-scroll-view.c
src/st/st-table.c
src/st/st-tooltip.c

index ed00e63b76a8038876a06cc51957919bfa06aedc..4c862b62a3cc3f99abcc162c49d151e809091d3c 100644 (file)
@@ -352,10 +352,8 @@ st_bin_dispose (GObject *gobject)
   StBinPrivate *priv = ST_BIN (gobject)->priv;
 
   if (priv->child)
-    {
-      clutter_actor_unparent (priv->child);
-      priv->child = NULL;
-    }
+    clutter_actor_destroy (priv->child);
+  g_assert (priv->child == NULL);
 
   G_OBJECT_CLASS (st_bin_parent_class)->dispose (gobject);
 }
index b87b0727cd8decbb44f991b15f3dbbae470580ea..e81f64cabe828893f37f0ba4898072f1d6c21ace 100644 (file)
@@ -403,11 +403,7 @@ st_box_layout_dispose (GObject *object)
   StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (object)->priv;
 
   while (priv->children)
-    {
-      clutter_actor_unparent (CLUTTER_ACTOR (priv->children->data));
-
-      priv->children = g_list_delete_link (priv->children, priv->children);
-    }
+    clutter_actor_destroy (priv->children->data);
 
   if (priv->hadjustment)
     {
index 450f4cc01ad4f9d2b67fba5d07d4891085920f86..ac79f4e93fb3ceb6cb53cd890760eba321331e4a 100644 (file)
@@ -162,7 +162,7 @@ st_entry_dispose (GObject *object)
 
   if (priv->entry)
     {
-      clutter_actor_unparent (priv->entry);
+      clutter_actor_destroy (priv->entry);
       priv->entry = NULL;
     }
 }
index 88fa868b0fecb2521400c54312bc34736287aac3..db9b0c1540c24a53480fe48c27ab333d392e10ed 100644 (file)
@@ -183,6 +183,20 @@ st_label_allocate (ClutterActor          *actor,
   clutter_actor_allocate (priv->label, &content_box, flags);
 }
 
+static void
+st_label_dispose (GObject   *actor)
+{
+  StLabelPrivate *priv = ST_LABEL (actor)->priv;
+
+  if (priv->label)
+    {
+      clutter_actor_destroy (priv->label);
+      priv->label = NULL;
+    }
+
+  G_OBJECT_CLASS (st_label_parent_class)->dispose (G_OBJECT (actor));
+}
+
 static void
 st_label_paint (ClutterActor *actor)
 {
@@ -227,6 +241,7 @@ st_label_class_init (StLabelClass *klass)
 
   gobject_class->set_property = st_label_set_property;
   gobject_class->get_property = st_label_get_property;
+  gobject_class->dispose = st_label_dispose;
 
   actor_class->paint = st_label_paint;
   actor_class->allocate = st_label_allocate;
index 2dd6f6ee6670ed64a9e0461e2133dbc751ab12d0..cb555eb1e6c211a6fa18a57e185ec3d9b9178461 100644 (file)
@@ -129,13 +129,13 @@ st_scroll_view_dispose (GObject *object)
 
   if (priv->vscroll)
     {
-      clutter_actor_unparent (priv->vscroll);
+      clutter_actor_destroy (priv->vscroll);
       priv->vscroll = NULL;
     }
 
   if (priv->hscroll)
     {
-      clutter_actor_unparent (priv->hscroll);
+      clutter_actor_destroy (priv->hscroll);
       priv->hscroll = NULL;
     }
 
index 9ef2cf123e6022f5d476df2b8e17d494a65faeda..e844ff6fb24cd7899fd8c7e80b49a0ee182455f2 100644 (file)
@@ -271,15 +271,9 @@ static void
 st_table_dispose (GObject *gobject)
 {
   StTablePrivate *priv = ST_TABLE (gobject)->priv;
-  GSList *l, *next;
 
-  for (l = priv->children; l;)
-    {
-      next = l->next;
-      clutter_container_remove_actor ((ClutterContainer *) gobject,
-                                      CLUTTER_ACTOR (l->data));
-      l = next;
-    }
+  while (priv->children)
+    clutter_actor_destroy (priv->children->data);
 
   G_OBJECT_CLASS (st_table_parent_class)->dispose (gobject);
 }
index 9ed299e22178e91afba03d2d17e77a283f10f9b8..5232dbc41ae84bc92630c100d587541471e4a015 100644 (file)
@@ -355,6 +355,20 @@ st_tooltip_unmap (ClutterActor *self)
   clutter_actor_unmap (priv->label);
 }
 
+static void
+st_tooltip_dispose (GObject *self)
+{
+  StTooltipPrivate *priv = ST_TOOLTIP (self)->priv;
+
+  if (priv->label)
+    {
+      clutter_actor_destroy (priv->label);
+      priv->label = NULL;
+    }
+
+  G_OBJECT_CLASS (st_tooltip_parent_class)->dispose (self);
+}
+
 static void
 st_tooltip_class_init (StTooltipClass *klass)
 {
@@ -367,6 +381,7 @@ st_tooltip_class_init (StTooltipClass *klass)
 
   gobject_class->set_property = st_tooltip_set_property;
   gobject_class->get_property = st_tooltip_get_property;
+  gobject_class->dispose = st_tooltip_dispose;
 
   actor_class->get_preferred_width = st_tooltip_get_preferred_width;
   actor_class->get_preferred_height = st_tooltip_get_preferred_height;